import 'package:flutter/material.dart';

import 'live_data.dart';

class PageLifecycleObserver extends NavigatorObserver {
  final Map<String, LiveData<int>> _liveDataMap = {};

  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    // if (route is ModalRoute && route.isFirst) {
    //   // 页面创建时
    //   final routeName = route.settings.name ?? '';
    //   LogUtils.i('路由管理 页面创建: $routeName');
    //   _liveDataMap[routeName] = LiveData<int>();
    //   _liveDataMap[routeName]?.post(0); // 初始化计数器
    // }
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPop(route, previousRoute);
    // if (route is ModalRoute && route.isFirst) {
    //   // 页面销毁时
    //   final routeName = route.settings.name ?? '';
    //   LogUtils.i('路由管理 页面销毁: $routeName');
    //   _liveDataMap[routeName]?.dispose(); // 清理资源
    //   _liveDataMap.remove(routeName);
    // }
  }

  LiveData<int>? getLiveData(String routeName) {
    return _liveDataMap[routeName];
  }
}

abstract class LifecycleObserver {
  void onInitState() {}

  void onDidChangeDependencies() {}

  void onBuild(BuildContext context) {}

  void onDidUpdateWidget() {}

  void onDeactivate() {}

  void onDispose() {}
}

mixin LifecycleOwner<T extends StatefulWidget> on State<T> {
  final List<LifecycleObserver> _lifecycleObserver = [];

  /// 存储一些数据，外界可用
  Map<String, dynamic> extras = {};

  ///在 State 对象被插入到 widget 树中时调用。
  /// 用于初始化状态，设置监听器等。
  @override
  void initState() {
    super.initState();
    for (final observer in _lifecycleObserver) {
      observer.onInitState();
    }
  }

  ///在 initState 之后调用，当依赖关系发生变化时也会调用。
  /// 用于获取依赖的数据，例如从 InheritedWidget 中获取数据。
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    for (final observer in _lifecycleObserver) {
      observer.onDidChangeDependencies();
    }
  }

  ///每当需要重新构建 UI 时调用。
  /// 用于构建页面的 UI。
  @mustCallSuper
  @override
  Widget build(BuildContext context) {
    for (final observer in _lifecycleObserver) {
      observer.onBuild(context);
    }
    return const _NullWidget();
  }

  ///当 State 对象从树中移除但可能重新插入时调用。
  /// 用于保存状态，准备重新插入。
  @override
  void deactivate() {
    super.deactivate();
    for (final observer in _lifecycleObserver) {
      observer.onDeactivate();
    }
  }

  ///当 State 对象的 widget 发生变化时调用。
  /// 用于更新状态，处理 widget 属性的变化。
  @override
  void didUpdateWidget(covariant T oldWidget) {
    super.didUpdateWidget(oldWidget);
    for (final observer in _lifecycleObserver) {
      observer.onDidUpdateWidget();
    }
  }

  ///当 State 对象从树中永久移除时调用。
  /// 用于释放资源，取消订阅等。
  @override
  void dispose() {
    super.dispose();
    // 内部会调用 removeObserver 所以创建观察者列表的副本
    final observersCopy = List<LifecycleObserver>.from(_lifecycleObserver);
    for (final observer in observersCopy) {
      observer.onDispose();
    }
  }

  void addObserver(LifecycleObserver observer) {
    _lifecycleObserver.add(observer);
  }

  void removeObserver(LifecycleObserver observer) {
    _lifecycleObserver.remove(observer);
  }
}

class _NullWidget extends StatelessWidget {
  const _NullWidget();

  @override
  Widget build(BuildContext context) {
    throw FlutterError(
      'Widgets that mix AutomaticKeepAliveClientMixin into their State must '
      'call super.build() but must ignore the return value of the superclass.',
    );
  }
}
